package learn.up.java.core.reflect;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

/*
 * 若不使用反射模式建立工厂类，则每次在增加新的Fruit实现类的时候，
 * 工厂方法都要做改动。在工厂方法中通过发射模式创建实例，就不需要因为子类的增加而去不断改变工厂类
 */
public class Reflect_Factory {

	//没有使用反射模式的工厂方法，创建实例
	public static Fruit newInstance(String name){
		Fruit f=null;
		if("Apple".equals(name)){
			f=new Apple();
		}
		if("Orange".equals(name)){
			f=new Orange();
		}
		return f;
	}
	
	//通过反射模式创建工厂方法，增加的子类都不需要再修改工厂类
	public static Fruit getInstance(String name) throws ClassNotFoundException{
		Class<?> cls=Class.forName(name);
		Fruit f=null;
		try {
			f=(Fruit)cls.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return f;
	}
	//初始化方法，获取保存了子类类名对应完整类名的properties文件
	public static Properties getProperties() throws FileNotFoundException, IOException{
		Properties p=new Properties();
		File f=new File("fruit.properties");
		if(f.exists()){
			p.load(new FileInputStream(f));
		}else{
			p.setProperty("Apple","day05.Apple");
			p.setProperty("Orange","day05.Orange");
			p.setProperty("Banana","day05.Banana");
			p.store(new FileOutputStream(f),"FRUIT CLASS");
		}
		return p;
	}
}
